package com.cgly.medical.util;

import cn.hutool.jwt.JWT;
import com.cgly.medical.domain.Account;
import com.cgly.medical.entity.AccountModel;
import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @program: medical
 * @description: token工具类
 * @author: chen di
 * @create: 2022-08-15 15:19
 */
public class JwtUtils {
    /**
     * 参考链接：https://www.bbsmax.com/A/WpdKW22odV/
     *
     * JWT由Header、Payload、Signature三部分组成，分别用.分隔。
     * Header：
     * 第一部分是请求头由两部分组成，alg与typ,第一个指定的是算法，第二指定的是类型。
     * Payload:
     * 第二部分是主体信息组成,用来存储JWT基本信息，或者是我们的信息。
     * Signature:
     * 第三部分主要是给第一部分跟第二部进行签名使用的,用来验证是否是我们服务器发起的Token，
     * secret是我们的密钥。
     */

    //过期时间 一天
    public static final long EXPIRE=1000*60*60*24;

    private static final String SECRET="#^%*gddj";

    //生成token
    public static String generateToken(AccountModel accountModel) {
        Map<String,Object> claims=new HashMap<String,Object>();
        claims.put("username", accountModel.getUname());
        claims.put("roles", accountModel.getUtype());
        JwtBuilder jwtBuilder=Jwts.builder();
        //签发算法，设置密钥
        jwtBuilder.signWith(SignatureAlgorithm.HS256,SECRET);
        //body数据，要唯一，自行设置
        jwtBuilder.addClaims(claims);
        //设置签发时间
        jwtBuilder.setIssuedAt(new Date());
        //设置过期时间
        jwtBuilder.setExpiration(new Date(EXPIRE));
        String token=jwtBuilder.compact();
        return token;
    }

    //解析token
    public static  Map<String,Object> parseToken(String token){
        Jwt jwt= Jwts.parser().setSigningKey(SECRET).parse(token);
        Map<String,Object>  claims=(Map<String,Object>)jwt.getBody();
        return claims;
    }

    public static void main(String[] args) {
//        String   token= JwtUtils.generateToken("chendi");
//        System.out.println(token);
//        Map<String,Object>map= JwtUtils.parseToken(token);
//        String acct=(String)map.get("acct");
//        System.out.println(acct);
    }






}